package cn.xzqwjw.taskmanager.security.handler;

import cn.xzqwjw.taskmanager.security.TokenJwt;
import cn.xzqwjw.taskmanager.utils.JwtUtil;
import org.springframework.security.core.Authentication;
import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Objects;

/**
 * @author rush
 */
@Component
public class JwtRefreshSuccessHandler implements AuthenticationSuccessHandler {

  @Override
  public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) {
    if (Objects.isNull(authentication)) {
      return;
    }
    String jwtString = ((TokenJwt) authentication).getJwtString();
    // 判断是否需要刷新jwt（即重新生成jwt），如果快要过期了就重新生成jwt，否则就啥也不做
    long refreshTokenInterval = 302400L;
    if (JwtUtil.isNeedRefreshToken(jwtString, refreshTokenInterval)) {
      String id = JwtUtil.getId(jwtString);
      String username = JwtUtil.getUsername(jwtString);
      // 过期时间24小时*7 （一周）
      Long expiration = 604800L;
      String roles = JwtUtil.getRoles(jwtString);
      String purviews = JwtUtil.getPurviews(jwtString);
      String newJwt = JwtUtil.createJwt(id, username, expiration, roles, purviews);
      // System.out.println("JwtRefreshSuccessHandler 里成功重新生成了jwt：" + newJwt);
      // 刷新jwt不需要输出到responseBody里，只需要更改 response 的 Header 里的 authorization 即可
      // 前台每次得到响应都要比对这个 jwt 和 cookie 里的 jwt 是否一致，如果一致则不做其他事
      // 如果不一致，则要更新 cookie 里的 jwt
      response.setHeader("authorization", newJwt);
    }
  }

}
